本文介绍: C基础的ObjectiveC学习(一?此笔记主要是OC的一些语言特性(在C语言基础上的),看完大概能对OC有一个大概的了解。具体怎么编码一个ios程序可能还是要在实践中学习。。。比如dispatch_async异步执行block比如UICollectionView这些类的常用方法Objective-C是C语言严格超集。但有些C语言语法合法代码objective-c中表达的意思不一定相同,比如某些布尔表达式,在C语言返回值true,但在Objective-C若与yes直接相比较函数将会出错,

C基础的ObjectiveC学习(一?

笔记主要是OC的一些语言特性(在C语言基础上的),看完大概能对OC有一个大概的了解。

具体怎么编码一个ios程序可能还是要在实践中学习。。。比如dispatch_async异步执行block,比如UICollectionView这些类的常用方法

Objective-C是C语言严格超集。但有些C语言语法合法代码objective-c中表达的意思不一定相同,比如某些布尔表达式,在C语言中返回值true,但在Objective-C若与yes直接相比较函数将会出错,因为在Objective-C中yes的值只表示为1。

.h 里的属性/方法对外公开

.m oc/c 里的 私有

.mm oc/c/c++

消息

c++用obj.method(argument)调用oc[obj method: argument]

在Objective-C,类别消息关系比较松散,调用方法视为对对象发送消息,所有方法都被视为对消息的回应。所有消息处理直到运行时(runtime)才会动态决定,并交由类别自行决定如何处理收到消息。也就是说,一个类别不保证一定会回应收到消息,如果类别收到了一个无法处理的消息,程序只会抛出异常,不会出错或崩溃。若调用了一个不存在方法,则程序依旧可以通过编译运行期抛出异常

NSLog(@“Hello, World! n”); 在屏幕显示消息,一定会被打印

日志处理:用类型定义打印日志,在实时构建中不打印日志

#import <Foundation/Foundation.h>

#define DEBUG 1

#if DEBUG == 0
#define DebugLog(...)
#elif DEBUG == 1
#define DebugLog(...) NSLog(__VA_ARGS__)
#endif

int main() {
   DebugLog(@"Debug log, our custom addition gets 
   printed during debug only" );
   NSLog(@"NSLog gets printed always" );     
   return 0;
}

@interface SampleClass:NSObject 用于创建接口(类的定义)。它继承NSObject,此类是所有对象基类@end接口结束interface里面方法public变量protected

@interface MyObject : NSObject {
    int memberVar1; // 实体变量
    id  memberVar2;
}

+(return_type) class_method; // 类方法

-(return_type) instance_method1; // 实例方法
-(return_type) instance_method2: (int) p1;
-(return_type) instance_method3: (int) p1 andPar: (int) p2;
@end

函数前面带有减号(-) 的方法实例方法,必须使用类的实例可以调用的。对应的有+号, 代表是类的静态方法,不需要实例即可调用。

允许函数嵌套

- (void) setColorToRed: (float)red Green: (float)green Blue:(float)blue; /* 宣告方法*/

[myColor setColorToRed: 1.0 Green: 0.8 Blue: 0.2]; /* 呼叫方法*/

@implementation MyObject定义私有变量私有方法、实现公开方法。@end结束

Objective-C创建对象通过alloc以及init两个消息alloc的作用是分配内存init则是初始化对象init与alloc都是定义在NSObject里的方法,父对象收到两个信息并做出正确回应后,新对象创建完毕。或者用new

MyObject * my = [[MyObject alloc] init];
MyObject * my = [MyObject new];//只是语法精简,效果完全相同

传实参:用指针

类型不加星号,引用类型(类创建出来的对象)加星号

重写UICollectionViewCell的初始化函数
@interface PhotoCell : UICollectionViewCell
@end

@implementation PhotoCell
-(instancetype)initWithFrame:(CGRet)frame{
	self = [super initwithFrame : frame];
	if(self){
		//重新初始化
	}
	return self;
}
@end
属性/Property

Objective-C属性(property)的特性(attribute) – 简书 (jianshu.com)

Property 和Synthesize
Property定义:@property 声明用于自动创建property属性变量的getter和setter
Synthesize定义:@Synthesize声明实现property属性变量的getter和setter。

例子:
interface:@property dataType variableName
implementation: synthesize variableName

@synthesize默认自动生成一个「下划线+属性名」的实例变量。比如@property (copy, nonatomic) NSString *name;之后,就可以直接使用_name这个变量了。–>懒加载 一般会判断一下if(!_name){初始化}

再后来(Xcode4.5开始),@synthesize也不需要了。一个@property搞定。

最短的写法就是什么都不写,连括号可以不要:

@property BOOL isOpen;

配套的点语法

Person *aPerson = [[Person alloc] initWithAge: 53];
aPerson.name = @"Steve"; // 注意:点表达式,等于[aPerson setName: @"Steve"];
NSLog(@"Access by message (%@), dot notation(%@), property name(%@) and direct instance variable access (%@)",
      [aPerson name], aPerson.name, [aPerson valueForKey:@"name"], aPerson->name);

person.name = @"Admin";       // 设置器方法

NSString *name = person.name; // 访问器方法

-(void) introduceMyselfWithProperties:(BOOL)useGetter
{
    NSLog(@"Hi, my name is %@.", (useGetter ? self.name : name)); // 为了利用表达式访问实例的属性,需要使用"self"关键字:
}
指针

指向自己指针
[self method]

类似于:c++/java
this.method();

指针nil而不是null

id 是一种通用的对象类型,它可以指向属于任何类的对象,也可以理解万能指针id ptr = [MyObject new];

- setMyValue:(id) foo;  //id表示参数"foo"可以是任何类的实例。
- setMyValue:(id <aProtocol>) foo;  //id<aProtocol>表示"foo"可以是任何类的实例,但必须采纳"aProtocol"协议。
- setMyValue:(NSNumber*) foo;  //该声明表示"foo"必须是"NSNumber"的实例。

-(BOOL)isKindOfClass:classObj 判断实例对象是否是这个类或者这个类的子类的实例

-(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例

+(BOOL) isSubclassOfClass:classObj 判断类是否是指定类的子类

协议/Protocol

需要协议的原因

一个协议就是一系列关联的方法的集合,协议中的方法并不是由协议本身去实现,而是由遵循这个协议的其他类来实现。换句话说,协议只是完成对协议函数的声明而并不管这些协议函数的具体实现

声明一个协议:(一般在.h文件中)

@protocol myProtocol <NSObject>  //NSObject本身也是一个协议,其中定义了很多基本的协议函数,比如performSelector,isKindOfClass,respondsToSelector,conformsToProtocol,retain,release等
@required  //遵守这个协议的那个类“必须要”实现接口
-(void) protocolNameA:(NSString*)string;
@optional  //可以实现也可以不实现的
-(void) protocolNameB:(NSString*)string;
@end

定义一个类遵从该协议:

@interface myClass  <myProtocol>
@interface myClass :NSObject<myProtocol>
@interface myClass :NSObject<myProtocol, NSCoding>

编译时候编译器自动检查myClass是否实现了myProtocol中的必要的(@required)接口。如果没有实现则会发出一个警告信息。如果有继承自myClass的子类,这些子类也是会自动遵循myClass所遵循的协议的,而且也可以重载这些接口

转发

Objective-C允许对一个对象发送消息,不管它是否能够响应之。除了响应或丢弃消息以外,对象也可以将消息转发到可以响应该消息的对象。转发可以用于简化特定的设计模式例如观测器模式代理模式

tbc

扩展/Category

@interface UIView (Geometry)Grometry扩展

一般用nonatomic

tbc

块/Block

块是Objective-C对象,因此它们可以添加NSArrayNSDictionary集合中。 它们还能够从封闭范围捕获值,使其类似于其他编程语言中的闭包lambda

void (^simpleBlock)(void) = ^{
   NSLog(@"This is a block");
}

double (^multiplyTwoValues)(double, double) =    
	^(double firstValue, double secondValue) {      
    return firstValue * secondValue;   
	}; 

double result = multiplyTwoValues(2,4);  
NSLog(@"The result is %f", result);

宏延续:

字符串化或数字符号运算符(#)在宏定义中使用时,将宏参数转换字符串常量。 此运算符只能在具有指定参数参数列表的宏中使用

#import <Foundation/Foundation.h> 

#define  message_for(a, b)     
	NSLog(@#a " and " #b ": We love you!n") 
	
int main(void) {   
	message_for(Carole, Debra);
    return 0; 
}
//output:  Carole and Debra: We love you!

宏定义中的令牌粘贴运算符(##)组合两个参数。 它允许将宏定义中的两个单独的标记连接到一个标记中。

#import <Foundation/Foundation.h>

#define tokenpaster(n) NSLog (@"token" #n " = %d", token##n)

int main(void) {
   int token34 = 40;

   tokenpaster(34);
   return 0;
}
//output:token34 = 40
基础框架foundation framework #import<Foundation/Foundation.h>

类似于c++的std
这里面东西挺多的 tbc一下

NSString类提供了字符串的类包装包含了所有你期望的优点,包括对保存任意长度字符串的内建内存管理机制支持Unicodeprintf风格格式化工具,等等。因为这种字符串使用的非常频繁,Objective-C提供了助记符@可以方便地从常量创建NSString对象。

NSString* myString = @"My Stringn";
NSString* anotherString = [NSString stringWithFormat:@"%d %s", 1, @"String"];

// 从一个C语言字符串创建Objective-C字符串
NSString*  fromCString = [NSString stringWithCString:"A C string" 
encoding:NSASCIIStringEncoding];

NSError类做错误处理核心属性是字符表示错误

Objective-C错误处理 – Objective-C教程™ (yiibai.com)

参考资料

Objective-C类别 – Objective-C教程™ (yiibai.com)

Objective-C 入门教程 | 菜鸟教程 (runoob.com)

BBCo – iOS开发零基础教程 Swift Objective-C (公开免费)_哔哩哔哩 (这个强推一下

原文地址:https://blog.csdn.net/weixin_45693821/article/details/124564764

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_24000.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注