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。
消息
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"关键字:
}
指针
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
- To declare methods that others are expected to implement
- To declare the interface to an object while concealing its class
- To capture similarities among classes that are not hierarchically related
- 减少继承类的复杂性(eg. UIKit设计了两个协议UITableViewDelegate,UITableViewDataSource来实现对UITableViewController类的控制)
一个协议就是一系列有关联的方法的集合,协议中的方法并不是由协议本身去实现,而是由遵循这个协议的其他类来实现。换句话说,协议只是完成对协议函数的声明而并不管这些协议函数的具体实现。
声明一个协议:(一般在.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是扩展名
(tbc
块/Block
块是Objective-C对象,因此它们可以添加到NSArray
或NSDictionary
等集合中。 它们还能够从封闭范围中捕获值,使其类似于其他编程语言中的闭包或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>
NSString类提供了字符串的类包装,包含了所有你期望的优点,包括对保存任意长度字符串的内建内存管理机制,支持Unicode,printf风格的格式化工具,等等。因为这种字符串使用的非常频繁,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];
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进行投诉反馈,一经查实,立即删除!