OC基础语法

前言

使用flutter期间 ,但是还是用到一些原生的,学习一些oc的基础用法。

#import <Foundation/Foundation.h> 
@interface MyClass : NSObject
@property (nonatomic, strong) NSString *myString;
- (void)myMethod;
@end
#endif /* MyClass_h */

一、基础数据类型

    int myInt = 10;
    float myFloat = 3.14f;//(注意要加f后缀来区分double类型)。
    double myDouble = 3.1415926;
    BOOL myBool = YES;
    BOOL myBoo2 = NO;
    //对象属性需要用*
    NSString *strs = @"OC";//字符串 @"OC"
    //打印日志
    NSLog(@"hello,world");
    
    NSLog(@"1+1=%d",2);
    NSLog(@"%@", strs);//@"%@"是格式化字符串的占位符,用于输出对象(在这里是NSString对象

   //数组
    NSArray *array = @[@"apple", @"banana", @"cherry"];
    //这个方法的参数列表最后必须以 nil 结束,nil 表示没有对象(指针为空
    NSArray *fruitsArray = [NSArray arrayWithObjects:@"apple", @"banana", @"cherry", nil];
    //这里 [NSNull null] 就占据了数组中的一个位置,而不是像 nil 那样用于结束数组元素列表。
    NSArray *fruitsArray2 = [NSArray arrayWithObjects:@"value1", [NSNull null], @"value3", nil];
    
    

二、类

OC的类有两个文件,一个.h ,一个.m

1. .h文件

对外公开类的接口,主要是用于向其他代码文件 “宣告” 这个类有哪些属性、方法等成员,是一种对外公开的接口定义。例如:

//导入 Foundation 框架的头文件,这是 OC 开发中常用的基础框架。
#import <Foundation/Foundation.h>
//声明一个名为MyClass的类,它继承自NSObject。NSObject是 OC 中几乎所有类的根类。
@interface MyClass : NSObject
//声明一个属性myString,类型是NSString(OC 中的字符串类型)。nonatomic表示非原子性操作(在多线程环境下性能稍好但不保证线程安全),strong表示是强引用,会增加对象的引用计数,防止对象被过早释放。
@property (nonatomic, strong) NSString *myString;
 @property NSString *normalStr;//默认是(atomic,strong)
//声明一个实例方法myMethod,返回值类型是void,即没有返回值。
- (void)myMethod;
//结束类的声
@end
2. .m文件

实现文件用于实现头文件中声明的方法。同时可以用于定义私有成员(属性和方法),对类进行扩展

#import "MyClass.h"

@interface MyClass ()
@property (nonatomic) NSInteger privateCount;
- (void)privateMethod;
@end

//开始实现MyClass这个类
@implementation MyClass
// 实现头文件中声明的myMethod方法
- (void)myMethod {
    self.myString = @"Hello, World!";
}
//结束类的实现。
@end

这里的 privateCount 属性和 privateMethod 方法只能在 MyClass 的 .m 文件内访问和使用,对于导入了 MyClass.h 的其他类来说,它们并不知道这些私有成员的存在,无法直接调用或访问,有助于对类内部实现细节的封装,避免外部代码随意干涉类的内部逻辑,提高代码的安全性和可维护性。

属性声明:使用@property关键字,在@interface中声明,如@property (nonatomic, strong) NSString *name;。
属性特性:包括读写控制(readonly、readwrite)、原子性控制(atomic、nonatomic)、语义设置(assign、retain、copy)等。如@property (nonatomic, readonly, copy) NSString *address;表示一个只读且赋值时会进行拷贝的address属性。
属性实现:可使用@synthesize关键字在@implementation中实现,如@synthesize name = _name;,也可由编译器自动合成。

3. 函数方法

调用myString的length方法

NSString *myString = @"Hello";
NSUInteger length = [myString length];

首先方法声明
-号类似成员方法,+类似静态方法
- (ReturnType)methodName:(ParameterType)parameterName;

@interface MyClass()
- (NSString *)stringByAppendingString:(NSString *)anotherString;
- (int)addSelf:(int)num;
- (int)add:(int)num1 and:(int)num2;
@end

方法声明位置:通常在.h头文件中的@interface和@end之间进行声明,用于向其他类展示该类所提供的方法接口。或者在.m文件中@interface和@end之间进行声明用于私有
然后方法调用
[instance methodName:parameterValue];

#import "MyClass.h"

@interface MyClass()
- (int)add:(int)num1 and:(int)num2;
- (int)addSelf:(int)num;
- (NSString *)stringByAppendingString:(NSString *)anotherString;
@end


@implementation MyClass

- (void)myMethod {
    NSLog(@"%d",[self addSelf:10]);
    NSLog(@"%d",[self add:11 and:12]);
    NSLog(@"%@", [self stringByAppendingString: @"oc"]);
}

- (int)add:(int)num1 and:(int)num2{
    return num1+num2;
}

- (int)addSelf:(int)num{
    return num+num;
}

- (NSString *)stringByAppendingString:(NSString *)anotherString{
    return [NSString stringWithFormat:@"My name is %@ ",anotherString];
}

//结束类的实现。
@end
4. 控制流与循环
 
    int num = 10;
    if (num > 5) {
        NSLog(@"Number is greater than 5");
    } else {
        NSLog(@"Number is less than or equal to 5");
    }
    for (int i = 0; i < 10; i++) {
        NSLog(@"%d", i);
    }
    int j = 0;
    while (j < 5) {
        NSLog(@"Value of j: %d", j);
        j++;
    }
    
int value = 5;
switch (value / 2) {
    case 1:
        NSLog(@"Value divided by 2 is 1");
        break;
    case 2:
        if (value % 2 == 1) {
            NSLog(@"Value divided by 2 is 2 and the original value is odd");
        } else {
            NSLog(@"Value divided by 2 is 2 and the original value is even");
        }
        break;
    default:
        NSLog(@"Something else");
        break;
}

for (int i = 0; i < 10; i++) {
    NSLog(@"%d", i);
}

int j = 0;
while (j < 5) {
    NSLog(@"Value of j: %d", j);
    j++;
}

int k = 0;
do {
    NSLog(@"Value of k: %d", k);
    k++;
} while (k < 3);
5. 枚举
/**
 typedef关键字用于为这个枚举类型创建一个别名。Weekday就可以像一个数据类型一样使用。枚举中的每个值(如Monday、Tuesday等)都代表一个整数常量,默认情况下,第一个值为0,后面的值依次递增1。所以在这个例子中,Monday的值是0,Tuesday的值是1,以此类推。
 */
typedef enum {
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
} Weekday;
/**
自定义
*/
typedef enum {
    Red = 1,
    Green = 2,
    Blue = 4
} Color;

//使用
   Weekday myDay = Wednesday;
    [self printWeekday:myDay];
    Color objectColor = Red | Blue;
- (void)printWeekday:(Weekday)day {
    switch (day) {
        case Monday:
            NSLog(@"It's Monday");
            break;
        case Tuesday:
            NSLog(@"It's Tuesday");
            break;
        // 其他case分支
        default:
            NSLog(@"It's another day");
            break;
    }
}
6. 继承
#import <Foundation/Foundation.h>
@interface Animal : NSObject
@property (nonatomic) NSInteger age;
- (instancetype)initWithAge:(NSInteger)age;
- (void)makeSound;
@end

@implementation Animal
- (void)makeSound {
    NSLog(@"Animal makes a sound");
}
- (instancetype)initWithAge:(NSInteger)age {
    self = [super init];
    if (self) {
        self.age = age;
    }
    return self;
}
@end

@interface Dog : Animal
@property (nonatomic) NSString *breed;
- (instancetype)initWithAge:(NSInteger)age andBreed:(NSString *)breed;
@end

@implementation Dog
- (void)makeSound {
    NSLog(@"Dog barks");
}
- (instancetype)initWithAge:(NSInteger)age andBreed:(NSString *)breed {
    self = [super initWithAge:age];
    if (self) {
        self.breed = breed;
    }
    return self;
}
@end

7. 构造函数

@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
- (instancetype)initWithName:(NSString *)name andAge:(NSInteger)age;
+ (instancetype)personWithName:(NSString *)name age:(NSInteger)age;
@end

@implementation Person
- (instancetype)initWithName:(NSString *)name andAge:(NSInteger)age {
    self = [super init];
    if (self) {
        self.name = name;
        self.age = age;
    }
    return self;
}

+ (instancetype)personWithName:(NSString *)name age:(NSInteger)age {
    Person *person = [[self alloc] init];
    person.name = name;
    person.age = age;
    return person;
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person1 = [Person new];
        NSString *n = person1.name;
        
        // 使用自定义初始化方法创建Person对象
        Person *person = [[Person alloc] initWithName:@"Alice" andAge:25];
        NSLog(@"Name: %@, Age: %ld", person.name, (long)person.age);
        //静态方法
        Person *newPerson = [Person personWithName:@"Bob" age:30];
    }
    return 0;
}

8.单例

#import <Foundation/Foundation.h>
@interface MySingleton : NSObject
+ (MySingleton *)sharedInstance;
@end

@implementation MySingleton
static MySingleton *sharedInstance = nil;
+ (MySingleton *)sharedInstance {
    if (sharedInstance == nil) {
        sharedInstance = [[self alloc] init];
    }
    return sharedInstance;
}
@end

后记

这些应该足够基础开发了,后续遇到问题了再新增

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 标识符的规则 字母、数字、下划线、美元符$,但是不能以数字开头; 区分大小写 不能是关键字 2. #impo...
    iOS佥阅读 643评论 0 0
  • 简单了解OC 1.Objective-C简称Obj-C或者OC,Objective的意思就是面向对象的。2.OC其...
    微小的沙土阅读 1,576评论 1 2
  • 一、#include和#import的区别 1.#import是#include指令的增强版,能实现include...
    萤火虫儿飞_阅读 951评论 0 0
  • 学习目标 1.【了解】Objective-C语言简介 2.【掌握】第一个OC程序 3.【掌握】OC中的字符串 4....
    Hm丶阅读 10,903评论 0 9
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 学习目标 1.【了解】Objective-C语言简介 2.【...
    LeaderBiao阅读 497评论 0 2